package data;

import java.sql.*;
import domain.*;
import java.util.List;
import java.util.LinkedList;
import util.UIDGenerator;

public class JDBCProyectoDAO implements IProyectoDAO {
	public	void insertProyecto(Proyecto p){
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Conexion abierta");
		String sql = "INSERT INTO proyectos(proyectoOID, nombreProyecto, descripcion, cupo, fechaInicio, fechaFin, finalizado, creadorOID) VALUES(?, ?, ?, ?, ?, ?, ?, ?)";
		PreparedStatement stmt = null;

		try {
			stmt = conn.prepareStatement(sql);
			
			stmt.setString(1, UIDGenerator.getInstance().getKey());
			stmt.setString(2, p.getNombreProyecto());
			stmt.setString(3, p.getDescripcion());
			stmt.setInt(4, p.getCupo());
			stmt.setDate(5, (Date)p.getFechaInicio());
			stmt.setDate(6, (Date)p.getFechaFin());
			stmt.setBoolean(7, p.getFinalizado());
			stmt.setString(8, p.getCreadorID());
			
			stmt.executeUpdate();
		} catch (SQLException e){
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Conexion cerrada");
			try {
				if (stmt != null){
					stmt.close();
				}
			} catch (SQLException e){
			}
		}
	}
	
	public void deleteProyecto(String proyectoID){
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Conexion abierta");
		String sql = "DELETE FROM proyectos WHERE (proyectoOID = ?)";
		PreparedStatement stmt = null;
		
		try{
			stmt = conn.prepareStatement(sql);
			stmt.setString(1, proyectoID);
			stmt.executeUpdate();
		} catch (SQLException e){
			System.err.println("Message: " + e.getMessage());
			System.err.println("SQLState: " + e.getSQLState());
			System.err.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Conexion cerrada");
			try {
				if (stmt != null)
					stmt.close();
			} catch (SQLException e) {
			}
		}
	}
	
	public Proyecto selectProyecto(String proyectoID){
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Conexion abierta");
		String sql = "SELECT * FROM proyectos WHERE (proyectoOID = ?)";
        PreparedStatement stmt = null;
        ResultSet result = null;
        Proyecto p = null;

        try {
            stmt = conn.prepareStatement(sql);
            stmt.setString(1, proyectoID);

            result = stmt.executeQuery();

            result.next();
            p = new Proyecto();
            p.setProyectoID(result.getString("proyectoOID"));
            p.setNombreProyecto(result.getString("nombreProyecto"));
            p.setDescripcion(result.getString("descripcion"));
            p.setCupo(result.getInt("cupo"));
            p.setFechaInicio(result.getDate("fechaInicio"));
            p.setFechaFin(result.getDate("fechaFin"));
            p.setFinalizado(result.getBoolean("finalizado"));
            p.setCreadorID(result.getString("creadorOID"));
        } catch (SQLException e) {
            System.out.println("Message: " + e.getMessage());
            System.out.println("SQLState: " + e.getSQLState());
            System.out.println("ErrorCode: " + e.getErrorCode());
        } finally {
        	ConnectionManager.getInstance().checkIn(conn);
        	System.out.println("Conexion cerrada");
            try {
                if (result != null) {
                    result.close();
                }
                if (stmt != null) {
                    stmt.close();
                }
            } catch (SQLException e) {
            }
        }
        return p;
	}
	
	public List<Proyecto> selectAllProyectos(){
		Connection conn = ConnectionManager.getInstance().checkOut();
		System.out.println("Conexion abierta");
		PreparedStatement stmt = null;
		ResultSet result = null;
		List<Proyecto> listaProyectos = new LinkedList<Proyecto>();
		String sql = "SELECT * FROM proyectos";
		try {
			stmt = conn.prepareStatement(sql);
			result = stmt.executeQuery();
			while (result.next()) {
				Proyecto p = new Proyecto();
				p.setProyectoID(result.getString("proyectoOID"));
				p.setNombreProyecto(result.getString("nombreProyecto"));
				p.setDescripcion(result.getString("descripcion"));
				p.setCupo(result.getInt("cupo"));
				p.setFechaInicio(result.getDate("fechaInicio"));
				p.setFechaFin(result.getDate("fechaFin"));
				p.setFinalizado(result.getBoolean("finalizado"));
				p.setCreadorID(result.getString("creadorOID"));
				
				listaProyectos.add(p);
			}
		} catch (SQLException e) {
			System.out.println("Message: " + e.getMessage());
			System.out.println("SQLState: " + e.getSQLState());
			System.out.println("ErrorCode: " + e.getErrorCode());
		} finally {
			ConnectionManager.getInstance().checkIn(conn);
			System.out.println("Conexion cerrada");
			try {
				if (result != null) {
					result.close();
				}
				if (stmt != null) {
					stmt.close();
				}
			} catch (SQLException e) {
			}
		}
		return listaProyectos;
	}
}